from. import user_blue
from flask import render_template,g,url_for,redirect,request,jsonify,session,current_app
from info.utils.comment import user_login_data
from info import response_code,db,constants
from info.utils.file_storage import upload_file
from info.models import Category,News

#新闻列表
@user_blue.route('/news_list')
@user_login_data
def user_news_list():
    user = g.user
    if not user:
        return redirect(url_for('index.index'))
    #2接受参数
    page = request.args.get('p','1')
    #3校验参数
    try:
        page = int(page)
    except Exception as e:
        current_app.logger.error(e)
        page='1'
    #4分页查询
    news_list = []
    current_page = 1
    total_page = 1
    try:  #获取到用户发布的所有新闻，用filter
        paginate = News.query.filter(News.user_id == user.id).paginate(page,constants.OTHER_NEWS_PAGE_MAX_COUNT,False)
        #5构造渲染数据
        news_list = paginate.items
        current_page = paginate.page
        total_page = paginate.pages
    except Exception as e:
        current_app.logger.error(e)
    #转换下时间
    news_dict_liat = []
    for news in news_list:
        #这里to_basic_dict没有"status": self.status添加一个或者换成to_review_dict
        news_dict_liat.append(news.to_basic_dict())

    context = {
        'news_list':news_dict_liat,
        'current_page':current_page,
        'total_page':total_page
    }
    # 6.渲染界面
    return render_template('news/user_news_list.html', context=context)


# 新闻发布
@user_blue.route('/news_release', methods=['GET', 'POST'])
@user_login_data
def news_release():
   #1获取登陆用户
   user = g.user
   if not user:
       return redirect(url_for('index.index'))
   #2GET
   if request.method == 'GET':
       #2.1渲染新闻的分类信息
       categories = []
       try:
           categories = Category.query.all()
       except Exception as e:
           current_app.logger.error(e)
       #”最新“ 分类这个不是用户发布新闻绑定的 删除掉最新这个分类 下标0
       categories.pop(0)

       context ={
           'categories':categories
       }
       return render_template('news/user_news_release.html',context=context)
   #3 post请求逻辑实现新闻发布的业务逻辑
   if request.method == 'POST':
       #3.1接受参数
       #标题
       title = request.form.get("title")
       source = "个人发布"
       #新闻摘要
       digest = request.form.get("digest")
       # 新闻内容#
       content = request.form.get("content")
       #索引图片
       index_image = request.files.get("index_image")
       #新闻分类id
       category_id = request.form.get("category_id")
       #3.2校验参数
       if not all([title,source,digest,content,index_image,category_id]):
           return jsonify(errno=response_code.RET.PARAMERR, errmsg='缺少参数')
       #3.3读取用户上传的新闻图片
       try: #读取图片
           index_image_data = index_image.read()
       except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=response_code.RET.PARAMERR, errmsg='读取新闻图片失败')
       #3.4讲用户上传的图片上传到七牛云
       try:
           key = upload_file(index_image_data)
       except Exception as e:
           current_app.logger.error(e)
           return jsonify(errno=response_code.RET.THIRDERR, errmsg='上传新闻图片失败')
       #3.5创建news模型对象,并赋值和同步到数据库
       news = News()
       news.title = title
       news.digest = digest
       news.source = source
       news.content = content
       # 纯粹是迫不得已：因为我们的是新闻类的网站，里面大部分的数据否是靠爬虫爬的，爬虫会将新闻的图片的全路径url爬下来
       # 那么我们就需要存储新闻图片的全路径url http://ip:port/path
       news.index_image_url = constants.QINIU_DOMIN_PREFIX + key
       news.category_id = category_id
       news.user_id =user.id
       #代表审核状态
       news.status = 1
       try:
           db.session.add(news)
           db.session.commit()
       except Exception as e:
           db.session.rollback()
           current_app.logger.error(e)
           return jsonify(errno=response_code.RET.DBERR, errmsg='保存新闻数据失败')

       # 3.6 响应新闻发布的结果
       return jsonify(errno=response_code.RET.OK, errmsg='发布新闻成功')

# 我的收藏
@user_blue.route('/user_collection')
@user_login_data
def user_collection():
    #1获取登录信息
    user = g.user
    if not user:
        return redirect(url_for('index.index'))
    #2接收参数？ 当前看几页 关键字p 默认是1
    page = request.args.get('p','1')
    #3校验参数 是 整数必须
    try:
        page = int(page)
    except Exception as e:
        current_app.logger.error(e)
        page ='1' # 公司中对于这种处理会有专门的方案的，不需要操心，不管怎么样都给看一页
    #4分页查询  user.collection_news == BaseQuery类型的对象
    paginate = None
    try:    #用户给的参数不合法，不打印错误信息
        paginate = user.collection_news.paginate(page,constants.OTHER_NEWS_PAGE_MAX_COUNT,False)
    except Exception as e:
        current_app.logger.error(e)
    #5构造渲染模板的数据
    news_list = paginate.items
    total_page = paginate.pages
    current_app =paginate.page


    #时间排序
    news_dict_list = []
    for news in news_list:
        news_dict_list.append(news.to_basic_dict())

    context={

        'news_list':news_dict_list,
        'total_page':total_page,
        'current_page':current_app,

    }
    #渲染魔板
    return render_template('news/user_collection.html',context=context)

#修改密码
@user_blue.route('/pass_info',methods=['GET','POST'])
@user_login_data
def pass_info():
    #1获取用户登录信息
    user = g.user
    if not user:
        return redirect(url_for('index.index'))
    #2get请求逻辑，渲染更改密码的界面
    if request.method =='GET':
        return render_template('news/user_pass_info.html')
    #3Post请求逻辑，修改密码业务逻辑实现
    if request.method =='POST':
        #3.1接收参数
        old_password = request.json.get('old_password')
        new_password = request.json.get('new_password')
        #3.2校验参数
        if not all([old_password,new_password]):
            return jsonify(error=response_code.RET.PARAMERR,errmsg='缺少参数')
        #判断输入的旧密码是不是该登录用户的密码
        if not user.check_passowrd(old_password):
            return jsonify(error=response_code.RET.PARAMERR,errmsg='旧密码输入错误')
        #3.4跟新密码  #setter 方法
        user.password = new_password
        #3.5同步数据库
        try:
            db.session.commit()
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(error=response_code.RET.DBERR, errmsg='保存修改后的密码失败')
        #3.6 响应修改密码后的结果
        return jsonify(error=response_code.RET.OK, errmsg='修改密码成功')

#修改头像
@user_blue.route('/pic_info',methods=['GET','POST'])
@user_login_data
def  pic_info():
    # 登录
    user = g.user
    if not user:
        # 重定向
        return redirect(url_for('index.index'))
        # 2.实现GET请求逻辑
    if request.method == 'GET':
        # 构造渲染数据的上下文
        context = {
            'user': user.to_dict()
        }
        # 渲染界面
        return render_template('news/user_pic_info.html', context=context)
    #实现渲染数据的上下文
    if request.method =='POST':
        #3.1获取参数 (图片)
        avatar_file = request.files.get('avatar')
        #3.2校验参数
        try:
            avatar_data = avatar_file.read()
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=response_code.RET.PARAMERR, errmsg='读取头像数据失败')
        #3.3调用上传的方法，将图片上传七牛
        try:
            key = upload_file(avatar_data)
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=response_code.RET.THIRDERR, errmsg='上传头像失败')
        #3.4保存用户头像的key到数据库
        #需要跟当前用户头像绑定！
        user.avatar_url = key
        try:
            db.session.commit()
        except Exception as e:
            db.session.rollback()
            current_app.logger.error(e)
            return jsonify(errno=response_code.RET.DBERR, errmsg='保存用户头像失败')

        data={
          'avatar_url':constants.QINIU_DOMIN_PREFIX + key
        }

        #响应上传的结果
        return jsonify(errno=response_code.RET.OK, errmsg='上传成功',data=data)

#基础资料
@user_blue.route('/base_info', methods=['GET', 'POST'])
@user_login_data
def base_info():
    #登录
    user = g.user
    if not user:
        # 重定向
        return redirect(url_for('index.index'))
        # 2.实现GET请求逻辑
    if request.method == 'GET':
        # 构造渲染数据的上下文
        context = {
            'user': user.to_dict()
        }
        # 渲染界面
        return render_template('news/user_base_info.html', context=context)
    #post请求
    if request.method == 'POST':
        #3.1参数昵称/个性签名/性别
        nick_name = request.json.get('nick_name')
        signature = request.json.get('signature')
        gender = request.json.get('gender')
        #3.2校验参数，是不是齐全，是男是女
        if not all([nick_name,gender,signature ]):
            return jsonify(errno=response_code.RET.PARAMERR, errmsg='缺少参数')
        if gender not in ['MAN','WOMAN']:
            return jsonify(errno=response_code.RET.PARAMERR, errmsg='参数错误')
        #3.3修改资料
        user.signature = signature
        user.nick_name = nick_name
        user.gender = gender
        try:
            db.session.commit()
        except Exception as e:
            db.session.rollback()
            current_app.logger.error(e)
            return jsonify(errno=response_code.RET.DBERR, errmsg='修改用户资料失败')
        #4 注意：修改以后需要状态保持信息中昵称页修改
        session['nick_name'] = nick_name
        #5响应
        return jsonify(errno=response_code.RET.OK, errmsg='修改基本资料成功')

#个人中心入口
@user_blue.route('/info')
@user_login_data
def user_info():
    #个人中心入口
    #必须是登录状态
    user = g.user
    if not user:
        #重定向
       return redirect(url_for('index.index'))

    context={
        'user':user.to_dict()
    }
    return render_template('news/user.html',context=context)